Generative Testing হল একটি ধরনের সফটওয়্যার টেস্টিং, যেখানে অটোমেটিক্যালি অপ্রত্যাশিত বা র্যান্ডম ইনপুট তৈরি করা হয় এবং সেগুলোর সাথে সফটওয়্যার পরীক্ষা করা হয়। এটি মূলত প্যারামেট্রিক টেস্টিংয়ের একটি পদ্ধতি, যেখানে কোনও নির্দিষ্ট ইনপুটের পরিবর্তে একটি সিস্টেম বা প্রোগ্রামকে বিভিন্ন ধরনের ইনপুটের সাথে পরীক্ষা করা হয়। এতে সফটওয়্যারটির সীমাবদ্ধতা, ভুল বা বাগ অল্প সময়ে সনাক্ত করা সম্ভব হয়।
Generative testing সাধারণত property-based testing এর সাথে সম্পর্কিত, যেখানে আপনি কিছু "properties" বা বৈশিষ্ট্য সংজ্ঞায়িত করেন এবং টেস্ট ফ্রেমওয়ার্কটি সেই বৈশিষ্ট্যগুলির উপর ভিত্তি করে র্যান্ডম ইনপুট তৈরি করে সেগুলি পরীক্ষণ করে।
Generative Testing এর মূল উপকারিতা:
stest/check
এর ব্যবহারClojure এ Generative Testing সাধারণত clojure.test.check
লাইব্রেরি ব্যবহার করে করা হয়, যা property-based testing করতে সহায়ক। stest/check
হল সেই ফাংশন যা আপনার টেস্ট পদ্ধতির মধ্যে randomized ইনপুট বা property পরীক্ষা করে।
clojure.test.check
লাইব্রেরি ব্যবহার করে আপনি একটি property সংজ্ঞায়িত করেন এবং সেটি যেকোনো র্যান্ডম ইনপুটের উপর পরীক্ষা করতে পারেন। এটি ইনপুটের বৈধতা, সঠিকতা, বা পারফরম্যান্স পরীক্ষা করতে সহায়ক।
clojure.test.check
লাইব্রেরি ইমপোর্ট করাপ্রথমে clojure.test.check
লাইব্রেরিটি ইমপোর্ট করতে হবে:
(require '[clojure.test.check :as stest])
(require '[clojure.test.check.generators :as gen])
clojure.test.check.generators
: বিভিন্ন ধরনের র্যান্ডম ডেটা তৈরি করার জন্য ব্যবহৃত হয়।clojure.test.check
: টেস্ট চালানোর জন্য ব্যবহৃত হয়।ধরা যাক, আমাদের একটি ফাংশন আছে যা দুটি সংখ্যার যোগফল ফেরত দেয়। আমরা এই ফাংশনের জন্য generative test করতে চাই।
(defn add [a b]
(+ a b))
এখন আমরা একটি টেস্ট লিখবো যাতে এটি নিশ্চিত হয় যে, যোগফল সঠিকভাবে হচ্ছে। আমরা দুটি এলোমেলো (random) সংখ্যা তৈরি করবো এবং তাদের যোগফল পরীক্ষায় দিবো।
(defn add-property-test []
(stest/quick-check 100 ;; মোট ১০০টি টেস্ট চালানো হবে
(stest/for-all [a (gen/int) b (gen/int)] ;; র্যান্ডম পূর্ণসংখ্যা ইনপুট তৈরি
(= (+ a b) (add a b)))))
এখানে:
quick-check
: এটি আমাদের টেস্ট চালানোর ফাংশন। আমরা এর মাধ্যমে ১০০টি র্যান্ডম ইনপুটের জন্য টেস্ট চালাবো।gen/int
: এটি এলোমেলোভাবে পূর্ণসংখ্যা তৈরি করে, যা ইনপুট হিসেবে ব্যবহৃত হবে।for-all
: এটি ব্যবহার করে বিভিন্ন ইনপুট ডেটা সেটের জন্য টেস্ট চালানো হয়।(stest/check add-property-test)
এটি টেস্ট চালাবে এবং যদি সব ইনপুট সঠিক হয়, তবে এটি পাস হবে। যদি কোনো ইনপুট ব্যর্থ হয়, তবে এটি ব্যর্থ টেস্টের বিস্তারিত তথ্য দেখাবে।
Generative testing আরও জটিল পরীক্ষা করতে সক্ষম, যেমন:
(defn even-gen []
(gen/fmap #(* 2 %) (gen/int))) ;; র্যান্ডম even সংখ্যার জন্য জেনারেটর
(defn even-add-property-test []
(stest/quick-check 100
(stest/for-all [a (even-gen) b (even-gen)]
(even? (+ a b))))) ;; টেস্ট: যে দুটি even সংখ্যা যোগ করা হচ্ছে, তাদের যোগফলও even হওয়া উচিত
এখানে, even-gen
একটি কাস্টম জেনারেটর তৈরি করেছে যা শুধুমাত্র even সংখ্যাগুলি তৈরি করবে এবং টেস্টটি এটি পরীক্ষা করবে যে, দুটি even সংখ্যার যোগফলও even হবে।
clojure.test.check
এর সাথে transducers
ব্যবহারের মাধ্যমে আপনি আরও দক্ষ ডেটা প্রসেসিং করতে পারেন, বিশেষত যখন বড় পরিমাণের ডেটা পরীক্ষা করতে হয়।
(defn transduce-test []
(stest/quick-check 100
(stest/for-all [coll (gen/vector gen/int 10)] ;; ১০টি এলোমেলো ইনপুট
(= (transduce (map inc) + coll) (apply + (map inc coll))))))
এখানে, একটি vector
তৈরি করা হয়েছে, এবং transduce
ব্যবহার করে ইনপুটের প্রতিটি মানকে বৃদ্ধি (increment) করে তার যোগফল বের করা হয়েছে। টেস্টটি নিশ্চিত করবে যে, transduce
এবং সাধারণ map
/apply
ব্যবহার করে একই ফলাফল পাবো।
Generative Testing বা Property-based Testing এমন একটি টেস্টিং পদ্ধতি যা র্যান্ডম বা অপ্রত্যাশিত ইনপুট ব্যবহার করে সফটওয়্যারের আচরণ পরীক্ষা করে। Clojure তে clojure.test.check
লাইব্রেরি ব্যবহার করে আপনি সহজেই generative tests তৈরি করতে পারেন। এর মাধ্যমে আপনি কোনো নির্দিষ্ট ইনপুটের পরিবর্তে প্রোগ্রামের বৈশিষ্ট্য বা property পরীক্ষা করতে পারেন।
gen
: এলোমেলো ডেটা তৈরি করার জন্য ব্যবহৃত হয়।quick-check
: টেস্ট চালানোর জন্য ব্যবহৃত হয়।for-all
: র্যান্ডম ইনপুটের জন্য পরীক্ষণ চালানো হয়।Generative testing আপনার কোডের অজানা ত্রুটি শনাক্ত করতে সহায়ক এবং এটি আপনার সফটওয়্যারটির স্থিতিশীলতা ও নির্ভরযোগ্যতা বাড়াতে সাহায্য করবে।
common.read_more